package com.odontosis.util;

import java.applet.Applet;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.PrintJob;
import java.awt.Toolkit;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

import com.odontosis.dto.ParametrosFiodDto;

/**
 * Applet de impressão da mala direta de pacientes
 * 
 * @author Pablo Henrique dos Reis
 *
 */
public class AppletImpressaoMalaDireta extends Applet {
	
private JLabel label;
	
	private JPanel panel;
	

	/*
	 * 0: nome do paciente
	 * 1: rua e número
	 * 2: Bairro
	 * 3: CEP
	 * 4: cidade
	 */
	
	private List<Object[]> objetos;
	
	int coluna1 = 35; //35
	int coluna2 = 305; //305
	
	int linha1 = 10 ;
	int linha2 = 10  + 8;
	int linha3 = 10  + 8 + 8 ;
	int linha4 = 10  + 8 + 8 + 8;
	int linha5 = 10  + 8 + 8 + 8 + 8;
	
	int somadois = 70;
	int somatres = 75;
	
	int tamanhoNome = 8;
	int tamanhoTexto = 6;
	
	int numeropaginas = 1; //calculado
	
	int paresetiqueta = 2;
	
	int l1;
	int l2;
	int l3;
	int l4;
	int l5;
	


	public void init() {

		inicializarParametros();
		//inicializarParametrosTeste();

		panel = new JPanel();
		
		panel.setBounds(600, 100, 100, 100);
		panel.setSize(100, 100);
		
		ImageIcon imgFundo = new ImageIcon(getClass().getResource("impressora0019.gif"));
		
		label = new JLabel();
		label.setIcon(imgFundo);
		panel.add(label);

		add(panel);
		
		imprimir();

	}
	
	public void inicializarParametros() {
		coluna1 = Integer.parseInt(getParameter("coluna1"));
		coluna2 = Integer.parseInt(getParameter("coluna2"));
		
		linha1 = Integer.parseInt(getParameter("linha1"));
		linha2 = Integer.parseInt(getParameter("linha2"));
		linha3 = Integer.parseInt(getParameter("linha3"));
		linha4 = Integer.parseInt(getParameter("linha4"));
		linha5 = Integer.parseInt(getParameter("linha5"));
		somadois = Integer.parseInt(getParameter("somadois"));
		somatres = Integer.parseInt(getParameter("somatres"));
		
		tamanhoNome = Integer.parseInt(getParameter("tamanho_nome"));
		tamanhoTexto = Integer.parseInt(getParameter("tamanho_texto"));
		
		paresetiqueta = Integer.parseInt(getParameter("paresetiqueta"));

		objetos = new ArrayList<Object[]>();
		Object[] valor = new Object[5];
		int i = 0;
		while (true) {
			try {
				String conteudoLinha = getParameter("parametro" + i);
				if (conteudoLinha == null) {
					objetos.add(valor);
					break;
				}
				if(i > 0 &&  i % 5 == 0) {
					objetos.add(valor);
					valor = new Object[5];
				}
				valor[i%5] = conteudoLinha;
				i++;
			} catch (Exception eop) {
				break;
			}
		}
		
		if(objetos.size() > 0) {			
			numeropaginas = ((objetos.size()-1) / (paresetiqueta * 2))  + 1;
		} else {
			numeropaginas = 0;
		}
		
		
		l1 = linha1;
		l2 = linha2;
		l3 = linha3;
		l4 = linha4;
		l5 = linha5;
	}
	
	public void inicializarParametrosTeste() {
		objetos = new ArrayList<Object[]>();
		Object[] objects = new Object[5];
		objects[0] = "xx";
		objects[1] = "x";
		objects[2] = "x";
		objects[3] = "x";
		objects[4] = "xx";
		objetos.add(objects);
		objects = new Object[5];
		objects[0] = "xx";
		objects[1] = "x";
		objects[2] = "x";
		objects[3] = "x";
		objects[4] = "xx";
		objetos.add(objects);
		objects = new Object[5];
		objects[0] = "xx";
		objects[1] = "x";
		objects[2] = "x";
		objects[3] = "x";
		objects[4] = "xx";
		objetos.add(objects);
		objects = new Object[5];
		objects[0] = "xx";
		objects[1] = "x";
		objects[2] = "x";
		objects[3] = "x";
		objects[4] = "xx";
		objetos.add(objects);
		objects = new Object[5];
		objects[0] = "xx";
		objects[1] = "x";
		objects[2] = "x";
		objects[3] = "x";
		objects[4] = "xx";
		objetos.add(objects);
		objects = new Object[5];
		objects[0] = "xx";
		objects[1] = "x";
		objects[2] = "x";
		objects[3] = "x";
		objects[4] = "xx";
		objetos.add(objects);
		objects = new Object[5];
		objects[0] = "xx";
		objects[1] = "x";
		objects[2] = "x";
		objects[3] = "x";
		objects[4] = "xx";
		objetos.add(objects);
		objects = new Object[5];
		objects[0] = "xx";
		objects[1] = "x";
		objects[2] = "x";
		objects[3] = "x";
		objects[4] = "xx";
		objetos.add(objects);
		objects = new Object[5];
		objects[0] = "xx";
		objects[1] = "x";
		objects[2] = "x";
		objects[3] = "x";
		objects[4] = "xx";
		objetos.add(objects);
		objects = new Object[5];
		objects[0] = "xx";
		objects[1] = "x";
		objects[2] = "x";
		objects[3] = "x";
		objects[4] = "xx";
		objetos.add(objects);
		objects = new Object[5];
		objects[0] = "xx";
		objects[1] = "x";
		objects[2] = "x";
		objects[3] = "x";
		objects[4] = "xx";
		objetos.add(objects);
		objects = new Object[5];
		objects[0] = "xx";
		objects[1] = "x";
		objects[2] = "x";
		objects[3] = "x";
		objects[4] = "xx";
		objetos.add(objects);
		objects = new Object[5];
		objects[0] = "xx";
		objects[1] = "x";
		objects[2] = "x";
		objects[3] = "x";
		objects[4] = "xx";
		objetos.add(objects);
		
		
		
		if(objetos.size() > 0) {			
			numeropaginas = ((objetos.size()-1) / (paresetiqueta * 2))  + 1;
		} else {
			numeropaginas = 0;
		}
		
		l1 = linha1;
		l2 = linha2;
		l3 = linha3;
		l4 = linha4;
		l5 = linha5;
	}
	
	
	public void imprimir() {

		// cria um frame temporário, onde será desenhado o texto a ser
		// impresso
		Frame f = new Frame("Frame temporário");
		f.pack();

		// pega o Toolkit do Frame
		Toolkit tk = f.getToolkit();

		// Pega os serviços de impressão existentes no computador,
		// para que seja escolhida uma impressora.
		// Também pode ser uma impressora de rede
		PrintJob pj = tk.getPrintJob(f, "print", null);

		int indice = 0;

		// Aqui se inicia a impressão
		if (pj != null) {
			
			for(int j = 0; j < numeropaginas; j++) {
				Graphics g = pj.getGraphics();
				
				linha1 = l1;
				linha2 = l2;
				linha3 = l3;
				linha4 = l4;
				linha5 = l5;
				
				for(int i = 0; i < paresetiqueta; i ++) {
				
					if(objetos.size() > indice) {
						Object[] objeto = objetos.get(indice);
					
						g.setFont(new Font("Courier New", Font.PLAIN, tamanhoNome));
						g.drawString(objeto[0].toString(), coluna1, linha1); 
						g.setFont(new Font("Courier New", Font.PLAIN, tamanhoTexto));
						g.drawString(objeto[1].toString(), coluna1, linha2); 
						g.drawString(objeto[2].toString(), coluna1, linha3);
						g.drawString(objeto[3].toString(), coluna1, linha4);
						g.drawString(objeto[4].toString(), coluna1, linha5);
					}
					indice++;
					
					if(objetos.size() > indice) {
						Object[] objeto = objetos.get(indice);
						
						g.setFont(new Font("Courier New", Font.PLAIN, tamanhoNome));
						g.drawString(objeto[0].toString(), coluna2, linha1); 
						g.setFont(new Font("Courier New", Font.PLAIN, tamanhoTexto));
						g.drawString(objeto[1].toString(), coluna2, linha2); 
						g.drawString(objeto[2].toString(), coluna2, linha3);
						g.drawString(objeto[3].toString(), coluna2, linha4);
						g.drawString(objeto[4].toString(), coluna2, linha5);
					}
					indice++;
					
					switch(i+1) {
					case 1:
					case 2:
					case 3:
						linha1 += somatres;
						linha2 += somatres;
						linha3 += somatres;
						linha4 += somatres;
						linha5 += somatres;
						break;
					case 4:
					case 5:
						linha1 += somadois;
						linha2 += somadois;
						linha3 += somadois;
						linha4 += somadois;
						linha5 += somadois;
						break;
					case 6:
					case 7:
					case 8:
						linha1 += somatres;
						linha2 += somatres;
						linha3 += somatres;
						linha4 += somatres;
						linha5 += somatres;
						break;
					case 9:
					case 10:
						linha1 += somadois;
						linha2 += somadois;
						linha3 += somadois;
						linha4 += somadois;
						linha5 += somadois;
						break;
					case 11:
					case 12:
					case 13:
						linha1 += somatres;
						linha2 += somatres;
						linha3 += somatres;
						linha4 += somatres;
						linha5 += somatres;
						break;
					default:
						linha1 += somatres;
						linha2 += somatres;
						linha3 += somatres;
						linha4 += somatres;
						linha5 += somatres;
					}
				}
	
				// libera os recursos gráficos
				g.dispose();
			}
			// encerra a impressão
			pj.end();
			
			try {
				System.out.println("Impressão concluída.");
				getAppletContext().showDocument(new URL("javascript:sucesso();"));
	
			} catch (MalformedURLException excpetion) {
				excpetion.printStackTrace();
			}
			
		} else {
			System.out.println("Impressora não selecionada.");
	    	try {
				
				getAppletContext().showDocument(new URL("javascript:falha('erro-impressora');"));
	
			} catch (MalformedURLException excpetion) {
				excpetion.printStackTrace();
			}
		}
		

		// desfaz o frame temporário
		f.dispose();

	}
}
